/*
 * WerknemerAdmin.cc
 *
 *  Created on: Sep 9, 2011
 *      Author: walter
 */

#include "WerknemerAdmin.h"
WerknemerAdmin::WerknemerAdmin() {
	werknemers = new map<int, Werknemer *> ;
	beschikbareWerknemerNummers = new vector<int> ;
	hoogsteWerknemerNummer = 0;
	ka = KooiAdmin::instance();
}
WerknemerAdmin::~WerknemerAdmin() {
	//	//werknemers  lijst leeg gooien
//	for (map<int, Werknemer *>::iterator iter = werknemers->begin(); iter != werknemers->end(); ++iter) {
//		cout << "bezig met verwijderen van: " << iter->second->getNaam() << endl;
//		//delete iter->second;
//
//
//		if (Oppasser* opp=dynamic_cast<Oppasser*>(iter->second)) {
//			delete opp;
//
//		} else if (Administrateur* adm=dynamic_cast<Administrateur*>(iter->second)) {
//			delete adm;
//
//		} else if (Manager* mana=dynamic_cast<Manager*>(iter->second)) {
//			delete mana;
//		}
//		cout << "verwijderd" << endl;
//	}
//	delete werknemers;

}

void WerknemerAdmin::werknemerToevoegen() {

	string werknemerNaam;
	int werknemerLeeftijd;
	string categorie;

	cout << "\nGeef op een regel, gescheiden door spatie(s) de naam, "
		"de leeftijd en de categorie van de werknemer op \n";
	// lees de gegevens in
	cin >> werknemerNaam >> werknemerLeeftijd >> categorie;
	// skip de rest van de regel
	cin.ignore(100, '\n');

	int wnNR = getWerknemerNummer();

	cout << "wnNR = " << wnNR << endl;

	if (categorie != "" && werknemerNaam != "" && werknemerLeeftijd != 0) {
		if (categorie == "administrateur") {
			Administrateur* administrateur = new Administrateur(werknemerNaam, werknemerLeeftijd, categorie);
			werknemerToevoegen(wnNR, administrateur, categorie);
			cout << "Werknemer met naam: " << werknemerNaam << " is aangenomen als " << categorie << endl;
		}

		else if (categorie == "oppasser") {
			Oppasser* oppasser = new Oppasser(werknemerNaam, werknemerLeeftijd, categorie);

			string kooiSoort;

			ka->drukKooienInhoudAf();

			cout << "\n Geef de naam van 1 van de bovenstaande diersoorten(Kooien) die de oppasser moet beheren:  \n";

			// lees de gegevens in
			cin >> kooiSoort;

			// skip de rest van de regel
			cin.ignore(100, '\n');

			cout << "Gekozen diersoort: " << kooiSoort << endl;

			map<string, Kooi*>::iterator iter = ka->getKooien()->find(kooiSoort);

			if (!(iter == ka->getKooien()->end())) {
				oppasser->setKooi(iter->second);
			} else {
				cout << "geen geldige kooisoort gevonden om aan de oppasser te koppelen" << endl;
			}

			werknemerToevoegen(wnNR, oppasser, categorie);

			cout << "Werknemer met naam: " << werknemerNaam << " is aangenomen als " << categorie << endl;
		}

		else if (categorie == "manager") {
			Manager* mana = new Manager(werknemerNaam, werknemerLeeftijd, categorie);

			cout << "Hoeveel ondergeschikten wilt u toevoegen aan uw onderschiktenlijst" << endl;
			int onderGeschiktenAantal;

			cin >> onderGeschiktenAantal;

			if (onderGeschiktenAantal != 0) {
				cout << "Geef de werknemernummer op van de persoon die u wilt toevoegen als uw ondergeschikte" << endl;
				toonAlleWerknemers();
				int NR;
				while (onderGeschiktenAantal != 0) {
					cin >> NR;
					cout << "Bezig met zoeken naar werknemer met nr " << NR << endl;
					map<int, Werknemer*>::iterator iter = werknemers->find(NR);
					if (iter->second != 0) {
						cout << "Werknemer gevonden  met nr " << NR << endl;
						mana->vulOndergeschiktenLijst(iter->second);
						onderGeschiktenAantal--;
					} else {
						cout << "werknemer met nummer: " << NR << " niet gevonden." << endl;
						break;
					}
				}
				cout << "Manager wordt opgeslagen met " << mana->getOndergeschiktenLijst()->size() << " ondergeschikte(n)" << endl;
			} else {
				cout << "Geen ondergeschikten geselecteerd. Manager wordt opgeslagen zonder ondergeschikten" << endl;
			}

			werknemerToevoegen(wnNR, mana, categorie);
			cout << "Done " << endl;

		} else {
			beschikbareWerknemerNummers->push_back(wnNR);
			cout << "Niet bestaande soort werknemer\n";
		}
	}

}

void WerknemerAdmin::werknemerToevoegen(int nr, Werknemer* de_werknemer, string categorie) {
	//uitleg van werknemer toevoegen is hetzelfde als dier toevoegen alleen worden werknemers niet in een kooi gestopt
	assert(de_werknemer!=0);
	assert(categorie != "");

	if (categorie == "administrateur") {
		werknemers -> insert(make_pair(nr, (Administrateur*) de_werknemer));
	}

	else if (categorie == "oppasser") {
		werknemers -> insert(make_pair(nr, (Oppasser*) de_werknemer));
		cout << "oppasser toegevoegd" << endl;
	}

	else if (categorie == "manager") {
		werknemers -> insert(make_pair(nr, (Manager*) de_werknemer));
	}

	else {
		cout << "Niet bestaande soort werknemer\n";
	}

}
void WerknemerAdmin::werknemerVerwijderen() {
	cout << endl << "Geef op een regel, gescheiden door spatie(s) het"
		" werknemernummer op van de persoon die verwijderd moet worden." << endl;

	int werknemerNummer;

	cin >> werknemerNummer;

	map<int, Werknemer*>::iterator iter = werknemers->find(werknemerNummer);

	if (iter == werknemers->end()) {
		cout << "De niet hardwerkende werknemer met nummer " << werknemerNummer << "is niet gevonden" << endl;
	} else {
		werknemerVerwijderen(werknemerNummer);
		cout << "Werknemer met nummer: " << werknemerNummer << " is ontslagen" << endl;
	}
	cout << "done " << endl;

}

void WerknemerAdmin::werknemerVerwijderen(int werknemerNR) {
	map<int, Werknemer*>::iterator iter = werknemers->find(werknemerNR);

	assert(iter->second != 0);

	Werknemer* teVerwijderenWerknemer = iter->second;

	if (Oppasser* opa=dynamic_cast<Oppasser*>(teVerwijderenWerknemer)) {
		//pointer zoogdier wijst naar object van type Zoogdier
		//terugkeerwaarde van dynamic_cast is meegegeven arg
		cout << "ik ben een opasser en ben ontslagen" << endl;
		for (map<int, Werknemer *>::iterator iter = werknemers->begin(); iter != werknemers->end(); ++iter) {
			if (Manager* mana=dynamic_cast<Manager*>(iter->second)) {
				//pointer eenDier wijst NIET naar object van type
				//Zoogdier; Terugkeerwaarde van dynamic_cast is 0
				mana->getOndergeschiktenLijst()->remove(opa);
			}

		}

	} else if (Administrateur* adm=dynamic_cast<Administrateur*>(teVerwijderenWerknemer)) {
		//pointer eenDier wijst NIET naar object van type
		//Zoogdier; Terugkeerwaarde van dynamic_cast is 0
		cout << "ik ben een administrateur en ben ontslagen" << endl;
		for (map<int, Werknemer *>::iterator iter = werknemers->begin(); iter != werknemers->end(); ++iter) {
			if (Manager* mana=dynamic_cast<Manager*>(iter->second)) {
				//pointer eenDier wijst NIET naar object van type
				//Zoogdier; Terugkeerwaarde van dynamic_cast is 0
				mana->getOndergeschiktenLijst()->remove(adm);
			}

		}
	}

	werknemers->erase(werknemerNR);

	beschikbareWerknemerNummers->push_back(werknemerNR);

	delete teVerwijderenWerknemer;
}
int WerknemerAdmin::getWerknemerNummer() {
	if (beschikbareWerknemerNummers->size() > 0) {
		vector<int>::iterator iter = beschikbareWerknemerNummers->begin();

		cout << "return: " << (*iter) << endl;

		beschikbareWerknemerNummers->erase(iter);
		return (*iter);

	} else {

		return hoogsteWerknemerNummer++;

	}
}
void WerknemerAdmin::toonAlleWerknemers() {

	cout << "Lijst van alle werknemers" << endl;

	// itereer over alle werknemers uit de lijst van werknemers
	for (map<int, Werknemer *>::iterator iter = werknemers->begin(); iter != werknemers->end(); ++iter) {
		cout << "Werknemernummer: " << iter->first << endl;
		iter->second->drukaf();
	}
	cout << endl;

}

void WerknemerAdmin::printSalarisPost(){
	int salarisPost = 0;
	for (map<int, Werknemer *>::iterator iter = werknemers->begin(); iter != werknemers->end(); ++iter) {
		salarisPost += iter->second->berekenSalaris();
	}
	cout << "Salarispost: " << salarisPost<< endl;
}

map<int, Werknemer*>* WerknemerAdmin::getWerknemers() {
	return werknemers;
}
